﻿
namespace CSharpLibs.Annotations
{
	/// <summary>
	/// Is the class/interface a builtin type
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface | System.AttributeTargets.Struct | System.AttributeTargets.Delegate | System.AttributeTargets.Enum)]
	public class BuiltinAttribute : System.Attribute
	{ }

	/// <summary>
	/// Is the method a builtin
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class BuiltinMethodAttribute : System.Attribute
	{ }

	/// <summary>
	/// The builtin semantics to use to simulate the effects of the method (the corresponding method body can be safely ignored)
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class BuiltinSemanticsAttribute : System.Attribute
	{
		public System.String CallTarget;
		public BuiltinSemanticsAttribute(System.String str)
		{
			this.CallTarget = str;
		}
	}

	/// <summary>
	/// Takes as an argument a space separated list strings representing the static fields that may be used/modified.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class UsedModStaticsAttribute : System.Attribute
	{
		public System.String Mod;

		public UsedModStaticsAttribute(System.String sv)
		{ this.Mod = sv; }
	}

	/// <summary>
	/// Mark methods that need to be patched in based on template instantiation with this.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class TypePatchNeededAttribute : System.Attribute
	{ }

	/// <summary>
	/// Mark the fields in the primitive value types that are just placeholders
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Field)]
	public class DummyPrimitiveFieldAttribute : System.Attribute
	{ }
}
